package com.springcloud.hystrix;

import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.springframework.web.client.RestTemplate;

/**
 * 自定义异常熔断器类,并集成熔断器的抽象父类
 * 注意
 *   父类可以指定一个泛型,这个泛型用于决定远程服务返回的数据封装类型以及服务熔断后的返回类型,建议使用Sting
 */
public class MyHystrixCommand extends HystrixCommand<String> {
    private RestTemplate restTemplate;
    private String url;

    public MyHystrixCommand(RestTemplate restTemplate,String url) {
        super(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")));
        this.restTemplate=restTemplate;
        this.url=url;
    }

    //run方法来自父类,用于访问某个具体的远程服务,这个方法不能手动调用
    @Override
    protected String run() throws Exception {
        return restTemplate.getForObject(url,String.class);
    }

    //服务降级方法,当run方法出现任意异常时都会调用合格方法来进行服务降级处理,这个方法不能手动调用
    @Override
    protected String getFallback() {
        return "远程服务触发了服务熔断";
    }
}
